package com.engine4cloud.tdf.common.core.util;

import org.springframework.util.ObjectUtils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;

/**
 * 编号生成规则
 */
public class CodeUtils {

    /**
     * 委托编号、同案犯编号、流程编号、自定义电子围栏编号等 生成规则：18位，
     *
     * @return String
     */
    public static String entrustCode() {
        // 生成时间戳部分
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        String timestamp = now.format(formatter);

        // 生成随机串部分
        int length = 6;
        Random random = new Random();
        StringBuilder randomNumber = new StringBuilder();
        for (int i = 0; i < length; i++) {
            randomNumber.append(random.nextInt(10)); // 生成随机数字
        }

        // 合并时间戳和随机串
        return timestamp + randomNumber;
    }

    /**
     * 矫正对象编号的生成规则：社区矫正对象编码采用4段16位阿拉伯数字代码表示，第1～6位是行政区划代码，第7～12位是录入日期（年月），第13～16位是顺序码。应符合以下要求;
     * a) 6 位行政区划代码为“省（区、市）、市（地、州、盟）、县（市、区、旗）”，符合 GB/T 2260和 GB/T 10114 的规定，行政区划代码不足 6 位的在后面加“0”补齐；
     * b) 6 位录入日期（年月）格式为 yyyyMM，符合 GB/T 7408；
     * c) 4 位人员顺序码从 0001 开始，至 9999 截止，不复用
     *
     * @param areaCode 6位行政编码
     * @return 矫正对象编号前缀（不包含4位人员顺序码）
     */
    public static String entrustCorrectorCodePrefix(String areaCode) {
        return areaCode.substring(0, 6) + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
    }

    /**
     * 矫正对象编号
     *
     * @param prefix      前缀-部门编码
     * @param deptMaxCode 部门下最大的编号
     * @return String
     */
    public static String entrustCorrectorCode(String prefix, String deptMaxCode) {
        String suffix;
        String start = "0001";
        if (ObjectUtils.isEmpty(deptMaxCode)) {
            suffix = start;
        } else {
            suffix = String.format("%04d", Integer.parseInt(deptMaxCode.substring(13)) + 1);
        }

        return prefix + suffix;
    }

    /**
     * 工作人员编号
     *
     * @param prefix      前缀-部门编码
     * @param deptMaxCode 部门下最大的编号
     * @return String
     */
    public static String entrustFunctionaryCode(String prefix, String deptMaxCode) {
        String suffix;
        String start = "0001";
        if (ObjectUtils.isEmpty(deptMaxCode)) {
            suffix = start;
        } else {
            suffix = String.format("%04d", Integer.parseInt(deptMaxCode.substring(18)) + 1);
        }

        return prefix + suffix;
    }
}

